/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "节点/节点.h"
#include "节点/插座/C_物体插座.h"
#include "节点/插座/list/list数值插座.h"
#include "节点/插座/list/list矢量插座.h"




class C_初始化点集约束到变换节点 : public C_节点基类 {
public:
	C_初始化点集约束到变换节点(S_设备环境& ctx);
	~C_初始化点集约束到变换节点();

	bool	f_update();
};

C_节点基类* f_node_加载初始化点集约束到变换节点(S_设备环境& ctx, FILE* f);
void		f_node_保存初始化点集约束到变换节点(C_节点基类* n, FILE* f);







class C_点集约束到变换节点 : public C_节点基类 {
public:
	C_点集约束到变换节点(S_设备环境& ctx);
	~C_点集约束到变换节点();

	bool	f_update();
};

C_节点基类* f_node_加载点集约束到变换节点(S_设备环境& ctx, FILE* f);
void		f_node_保存点集约束到变换节点(C_节点基类* n, FILE* f);







class C_射线物体相交节点 : public C_节点基类 {
	S_点距八叉树*	m_Tree;
	S_GPU计算*		m_GPU计算设备;
	S_GPU参数槽		m_参数;
public:
	C_射线物体相交节点(S_设备环境& ctx);
	~C_射线物体相交节点();

	S_Props		m_使用光追线管;
	S_Props		m_是否构建八叉树;
	//S_Props		m_是否改变原数据;
	//S_Props		m_执行代码;

	bool	f_update();

	void	f_计算Vec3(std::vector<vec3>& data);
	void	f_计算Vec4(const std::vector<vec4>& data);
	void	f_计算网格(const std::vector<S_Mesh*>& data);
	//void	f_物体(uint8 方式, std::vector<S_物体*>& objs);
	//void	f_线段(std::vector<S_线段>& lines);
	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_创建射线物体相交节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载射线物体相交节点(S_设备环境& ctx, FILE* f);
void		f_node_保存射线物体相交节点(C_节点基类* n, FILE* f);





class C_圆坐标生成节点 : public C_节点基类 {
	
public:
	C_圆坐标生成节点(S_设备环境& ctx);
	~C_圆坐标生成节点();

	bool	f_update();
	std::string	f_编译(C_节点基类* rn, std::string& 声明, std::vector<std::string>& 定义, std::string& 释放);

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_创建圆坐标生成节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载圆坐标生成节点(S_设备环境& ctx, FILE* f);
void		f_node_保存圆坐标生成节点(C_节点基类* n, FILE* f);



class C_直线坐标生成节点 : public C_节点基类 {

public:
	C_直线坐标生成节点(S_设备环境& ctx);
	~C_直线坐标生成节点();

	bool	f_update();
	std::string	f_编译(C_节点基类* rn, std::string& 声明, std::vector<std::string>& 定义, std::string& 释放);

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_创建直线坐标生成节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载直线坐标生成节点(S_设备环境& ctx, FILE* f);
void		f_node_保存直线坐标生成节点(C_节点基类* n, FILE* f);



class C_平面坐标生成节点 : public C_节点基类 {

public:
	C_平面坐标生成节点(S_设备环境& ctx);
	~C_平面坐标生成节点();

	bool	f_update();
	std::string DEF_节点编译函数;

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_创建平面坐标生成节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载平面坐标生成节点(S_设备环境& ctx, FILE* f);
void		f_node_保存平面坐标生成节点(C_节点基类* n, FILE* f);




class C_曲线采样节点 : public C_节点基类 {

public:
	C_曲线采样节点(S_设备环境& ctx);
	~C_曲线采样节点();

	S_Props		m_曲线类型;

	bool	f_update();
	std::string	f_编译(C_节点基类* rn, std::string& 声明, std::vector<std::string>& 定义, std::string& 释放);

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_创建曲线采样节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载曲线采样节点(S_设备环境& ctx, FILE* f);
void		f_node_保存曲线采样节点(C_节点基类* n, FILE* f);




class C_渐变采样节点 : public C_节点基类 {

public:
	C_渐变采样节点(S_设备环境& ctx);
	~C_渐变采样节点();

	S_Props		m_曲线类型;
	S_Props		m_曲线;
	//S_Props		m_曲线GPU区间;

	bool	f_update();
	std::string	f_编译(C_节点基类* rn, std::string& 声明, std::vector<std::string>& 定义, std::string& 释放);

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
	void    f_Copy(const C_节点基类* node);
};

C_节点基类* f_node_创建渐变采样节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载渐变采样节点(S_设备环境& ctx, FILE* f);
void		f_node_保存渐变采样节点(C_节点基类* n, FILE* f);



class C_绕点旋转节点 : public C_节点基类 {

public:
	C_绕点旋转节点(S_设备环境& ctx);
	~C_绕点旋转节点();

	S_Props		m_曲线;

	bool	f_update();
	std::string DEF_节点编译函数;

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_创建绕点旋转节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载绕点旋转节点(S_设备环境& ctx, FILE* f);
void		f_node_保存绕点旋转节点(C_节点基类* n, FILE* f);




class C_步进计算节点 : public C_节点基类 {
	void f_插座兼容切换(bool& 创建数组, bool& 创建浮点);

public:
	C_步进计算节点(S_设备环境& ctx);
	~C_步进计算节点();

	S_Props		m_步进方式;
	
	bool	f_update();
	std::string DEF_节点编译函数;

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_创建步进计算节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载步进计算节点(S_设备环境& ctx, FILE* f);
void		f_node_保存步进计算节点(C_节点基类* n, FILE* f);




//class C_累加器节点 : public C_节点基类 {
//	void f_插座兼容切换(bool& 创建数组, bool& 创建浮点);
//
//public:
//	C_累加器节点(S_设备环境& ctx);
//	~C_累加器节点();
//
//	S_Props		m_累加类型;
//
//	bool	f_update();
//	std::string DEF_节点编译函数;
//
//	void	f_读取(FILE* f);
//	void	f_写入(FILE* f);
//};
//
//C_节点基类* f_node_创建累加器节点(S_设备环境& ctx, C_节点树* 子节点树);
//C_节点基类* f_node_加载累加器节点(S_设备环境& ctx, FILE* f);
//void		f_node_保存累加器节点(C_节点基类* n, FILE* f);







